package com.own.component.store.core.method;

import com.own.component.store.core.method.base.BaseStore;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.List;

/**
 * StoreList
 *
 * @author chenxueli
 * @date 2022-06-15 03:14:15
 */
@Component
public interface StoreList<T> extends BaseStore {

    /**
     * 获取整个列表
     *
     * @param name 唯一key
     * @return 列表
     */
    List<T> get(String name);

    /**
     * 获取子集
     *
     * @param name  唯一key
     * @param start 开始位置
     * @param end   结束位置
     * @return 列表
     */
    List<T> range(String name, long start, long end);

    /**
     * 根据索引获取值
     *
     * @param name  唯一key
     * @param index 索引
     * @return 值
     */
    T index(String name, long index);

    /**
     * 获取最左侧的值
     *
     * @param name 唯一key
     * @return 值
     */
    T leftPop(String name);

    /**
     * 获取最右侧的值
     *
     * @param name 唯一key
     * @return 值
     */
    T rightPop(String name);

    /**
     * 设置值
     *
     * @param name  唯一key
     * @param index 位置
     * @param value 值
     */
    void set(String name, int index, T value);

    /**
     * 插入值
     *
     * @param name  唯一key
     * @param value 值
     */
    void add(String name, T value);

    /**
     * 插入值
     *
     * @param name   唯一key
     * @param values 值列表
     */
    default void add(String name, Collection<T> values) {
        values.forEach(value -> add(name, value));
    }

    /**
     * 插入值
     *
     * @param name   唯一key
     * @param values 值列表
     */
    void add(String name, T... values);

    /**
     * 左侧插入值
     *
     * @param name  唯一key
     * @param value 值
     */
    default void leftAdd(String name, T value) {
        add(name, value);
    }

    /**
     * 左侧插入值
     *
     * @param name   唯一key
     * @param values 值列表
     */
    default void leftAdd(String name, Collection<T> values) {
        add(name, values);
    }

    /**
     * 左侧插入值
     *
     * @param name   唯一key
     * @param values 值列表
     */
    default void leftAdd(String name, T... values) {
        add(name, values);
    }

    /**
     * 右侧插入值
     *
     * @param name  唯一key
     * @param value 值
     */
    void rightAdd(String name, T value);

    /**
     * 右侧插入值
     *
     * @param name   唯一key
     * @param values 值列表
     */
    default void rightAdd(String name, Collection<T> values) {
        values.forEach(value -> add(name, value));
    }

    /**
     * 右侧插入值
     *
     * @param name   唯一key
     * @param values 值列表
     */
    void rightAdd(String name, T... values);

    /**
     * 是否包含
     *
     * @param name  唯一key
     * @param value 值
     * @return 是否包含
     */
    boolean contains(String name, T value);

    /**
     * 根据索引移除
     *
     * @param name  唯一key
     * @param index 索引
     */
    void remove(String name, int index);

    /**
     * 根据值移除左侧第一个匹配的值
     *
     * @param name  唯一key
     * @param value 值
     */
    void remove(String name, T value);

    /**
     * 类型名称
     *
     * @return 类型名称
     */
    @Override
    default String type() {
        return "list";
    }

}
